<?php

namespace app\msgapi\model;

use think\Model;

abstract class BaseModel extends Model
{
    // 验证器验证后返回验证提示语
    public function validate($data, $scene = ''): ?string
    {
        $class = 'app\\msgapi\\validate\\' . $this->getName();
        if (class_exists($class)) {
            $v = new $class;
            if ($scene) {
                $v->scene($scene);// 加载验证场景
            }
            if (!$v->check($data)) {
                return $v->getError();
            }
        }
        return null;
    }

    /**
     * 将返回的资源类型的地址带上域名
     * @param mixed $value
     * @param int $type 0普通字段，1编辑器内容，2常规图集字段
     * @return string|array
     */
    function addDomain($value, int $type = 0)
    {
        if (!$value) {
            return $value;
        }
        $domain = request()->domain();// 尽量用配置固定值，自动取值有时在前后端分离、反向代理时不是预期值
        switch ($type) {
            case 1:     // 编辑器内容时使用正则拼接图片的域名
                $value = preg_replace_callback('/<[img|IMG].*?src=[\'| \"](?![http|https])(.*?(?:[\.gif|\.jpg|\.jpeg|\.png]))[\'|\"].*?[\/]?>/', function ($r) use ($domain) {
                    return str_replace($r[1], $domain . $r[1], $r[0]);
                }, htmlspecialchars_decode($value, ENT_QUOTES));// 不走获取器，先转为html
                break;
            case 2:     // 图集时将所有img字段添加域名。
                // 注意这里如果使用字段指定类型时走获取器时不会自动转为数组，先处理为数组
                if (is_string($value)) {
                    $value = json_decode($value, true);
                }
                foreach ($value as $k1 => $v1) {
                    if ($v1['img'] && (substr($v1['img'], 0, 4) != 'http')) {
                        $value[$k1]['img'] = $domain . $v1['img'];
                    }
                }
                break;
            default:    // 默认是普通图片字段
                if (substr($value, 0, 4) != 'http') {
                    $value = $domain . $value;
                }
                break;
        }
        return $value;
    }
}